您现在的位置是:首页 > JAVA教程 > 正文

Java创建多线程的三种方法及示例代码详解

编辑:本站更新:2024-09-15 05:22:22人气:718
在 Java 编程语言中,实现并行和并发的关键技术之一就是多线程。通过使用多线程编程模型,我们可以在单个程序内同时执行多个任务,并共享相同的内存空间,从而提高应用程序的整体性能与效率。本文将详细介绍Java中创建多线程的三种主要方式及其对应的实例代码。

**一、继承Thread类**

首先是最直观且易于理解的方式:直接从 `java.lang.Thread` 类派生出新的子类,在此类内部重写其 `run()` 方法来定义线程要完成的任务逻辑。

java

public class MyThread extends Thread {
@Override
public void run() {
for (int i = 0; i < 10; ++i) {
System.out.println("This is thread " + this.currentThread().getName());
}
}

// 启动新线程的方法
public static void main(String[] args) {
MyThread t1 = new MyThread();
t1.start();

MyThread t2 = new MyThread();
t2.setName("CustomThread");
t2.start();
}
}

上述代码展示了如何自定义一个名为MyThread的线程类以及启动两个不同的线程t1 和 t2 并各自运行它们自己的 `run()` 方法。

**二、实现Runnable接口**

另一种更为灵活的方式来创建线程是让我们的类去实现 `java.lang.Runnable` 接口。这种方式避免了单一继承带来的局限性(即允许该类继续其他类),并且更符合面向对象设计原则中的“针对行为进行抽象”。

以下是一个实现了 Runnable 的例子:

java

class Worker implements Runnable {
private String name;

public Worker(String str){
this.name=str;
}

@Override
public void run(){
for(int i=0;i<5;i++){
try{
Thread.sleep(100);
}catch(Exception e){System.out.println(e);}

System.out.println(name+" "+i);
}
}

public static void main(String []args){

Worker task=new Worker("Task-1");
Thread workerThrd=new Thread(task,"Worker_Thread_1");

Task anotherTask=new Worker("Task-2");
Thread secondThrDd=new Thread(anotherTask , "Worker_Thread_2");

workerThrd.start();
secondThrDd.start();

}
}


在这个例子中,“Worker”类作为Runnable的一个具体实现,然后我们将这个"worker"传递给Thread构造函数以生成一个新的线程实体。

**三、Lambda表达式配合Callable/Future接口**

自从JDK8开始引入 Lambda 表达式以来,我们可以利用 Callable 接口结合 Future 来优雅地处理具有返回值的异步计算场景下的多线程操作。尽管这并非严格意义上的新建线程方法,但在实际开发过程中却非常实用有效。

下面展示了一个简单的应用示例:
java

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class CallableExample {

public static void main(String[] args) throws ExecutionException, InterruptedException {
ExecutorService executorService = Executors.newSingleThreadExecutor();

Future<Integer> futureResult = executorService.submit(new Callable<Integer>() {
@Override
public Integer call() throws Exception {
int sum = calculateSum();
return sum;
}

private int calculateSum() {
int result = 0;
for (int i = 0; i <= 100; i++) {
result += i;
}
return result;
}
});

// 获取Future结果并在主线程打印
System.out.printf("The Sum of numbers from 0 to 100 computed in the separate thread : %s%n",futureResult.get());

executorService.shutdownNow();
}
}

以上这段代码里,我们借助于 Callable 创建可产生未来结果的对象并通过 submit 提交给 ExecutorService 进行异步运算。当调用 get 方法时会阻塞直到获取到由另一个线程产生的结果。

总结来说,基于对基础的Thread扩展、Runnable接口的实现以及高级功能如lambda+Callable+Futures等途径,开发者可以根据应用场景选择最合适的方案构建高效的Java多线程环境。每种方法都有各自的优点和适用范围,请依据项目需求作出最佳决策。
关注公众号

www.php580.com PHP工作室 - 全面的PHP教程、实例、框架与实战资源

PHP学习网是专注于PHP技术学习的一站式在线平台,提供丰富全面的PHP教程、深入浅出的实例解析、主流PHP框架详解及实战应用,并涵盖PHP面试指南、最新资讯和活跃的PHP开发者社区。无论您是初学者还是进阶者,这里都有助于提升您的PHP编程技能。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

最新推荐

本月推荐